package de.fhffm.gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhffm.tables.Duenger;

public class NeuerDuengerFenster implements ActionListener {

	private JButton btnOk = new JButton("OK");
	private JButton btnAbbrechen = new JButton("Abbrechen");
	
	private JLabel labelMarke = new JLabel("Marke");
	private JLabel labelStickstoff = new JLabel("Stickstoff");
	private JLabel labelPhosphat = new JLabel("Phosphat");
	private JLabel labelKalium = new JLabel("Kalium");
	private JLabel labelMagnesium = new JLabel("Magnesium");
	
	private JTextField txtMarke = new JTextField(8);
	private JTextField txtStickstoff = new JTextField(8);
	private JTextField txtPhosphat = new JTextField(8);
	private JTextField txtKalium = new JTextField(8);
	private JTextField txtMagnesium = new JTextField(8);
	
	private JFrame neuerDuengerFrame = new JFrame();
	
	private JPanel eingabePanel = new JPanel(new GridLayout(5,2));
	private JPanel buttonPanel = new JPanel();
	
	private String marke = null;
	private String stickstoffString = null;
	private String phosphatString = null;
	private String kaliumString = null;
	private String magnesiumString = null;
	
	private int stickstoff = 0;
	private int phosphat = 0;
	private int kalium = 0;
	private int magnesium = 0;
	
	StringBuilder sb = new StringBuilder();
	
	
	public NeuerDuengerFenster() {
		
		neuerDuengerFrame.setTitle("Neuer Duenger");	
		neuerDuengerFrame.setSize(400,500);
		neuerDuengerFrame.setLocationRelativeTo(null);
		neuerDuengerFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		neuerDuengerFrame.setVisible(true);
		neuerDuengerFrame.setResizable(true);
		neuerDuengerFrame.setLayout(new BorderLayout());
		
		eingabePanel.add(labelMarke);
		eingabePanel.add(txtMarke);
		eingabePanel.add(labelStickstoff);
		eingabePanel.add(txtStickstoff);
		txtStickstoff.setToolTipText("Menge des im Dünger enthaltenen Stickstoffs in %");
		eingabePanel.add(labelPhosphat);
		eingabePanel.add(txtPhosphat);
		txtPhosphat.setToolTipText("Menge des im Dünger enthaltenen Phosphats in %");
		eingabePanel.add(labelKalium);
		eingabePanel.add(txtKalium);
		txtKalium.setToolTipText("Menge des im Dünger enthaltenen Kaliums in %");
		eingabePanel.add(labelMagnesium);
		eingabePanel.add(txtMagnesium);
		txtMagnesium.setToolTipText("Menge des im Dünger enthaltenen Magnesiums in %");
		
		buttonPanel.add(btnOk);
		buttonPanel.add(btnAbbrechen);
		
		btnOk.addActionListener(this);
		btnAbbrechen.addActionListener(this);
		
		neuerDuengerFrame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
		neuerDuengerFrame.getContentPane().add(eingabePanel,BorderLayout.CENTER);
	}
	

	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();

		if (obj == btnAbbrechen) {	
			neuerDuengerFrame.dispose();
		}
		
		if(obj == btnOk){
			
			if(ueberpruefeEingabe()){
				
				if(duengerNichtVorhanden()){ 
					fuegeDuengerEin();
					 einfügenEnde();
				}else{
					System.out.println("Duenger schon vorhanden!");
				}
			
			} else{
				
				System.out.println("Eingabe Fehler");
			}
		}
	}

	private void fuegeDuengerEin() {
		
		System.out.println("Duenger wird eingefügt");
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Duenger duenger = new Duenger();
		
		duenger.setDuengerMarke(marke);
		duenger.setPhosphat(phosphatString);
		duenger.setKalium(kaliumString);
		duenger.setStickstoff(stickstoffString);
		duenger.setMagnesium(magnesiumString);
		
		em.persist(duenger);
		em.getTransaction().commit();
		em.close();
	}
	
	public void einfügenEnde(){
		Object[] options = {"Fertig!","Neuer Duenger!"};
		int selected = JOptionPane.showOptionDialog(null,"Duenger hinzugefügt!", "Hinzufügen Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			neuerDuengerFrame.dispose();
			break;
		case 1:
			loescheTextFelder();
			break;
		}
	}
	
	private void loescheTextFelder() {
		
		txtMarke.setText(null);
		txtMagnesium.setText(null);
		txtPhosphat.setText(null);
		txtKalium.setText(null);
		txtStickstoff.setText(null);
		
	}
	
	private boolean ueberpruefeEingabe() {
		boolean pruefe = false;
		try {
			pruefe = hohleEingabe();
		} catch (InputException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Phosphat,Magnesium, Kalium und Stickstoff nur Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
		
	}
	
	private boolean hohleEingabe() throws InputException,NumberFormatException {
		
		marke = txtMarke.getText();
		stickstoff = Integer.parseInt(txtStickstoff.getText());
		sb.append(stickstoff).append(" %");
		stickstoffString = sb.toString();
		sb.setLength(0);
		phosphat = Integer.parseInt(txtPhosphat.getText());
		sb.append(phosphat).append(" %");
		phosphatString = sb.toString();
		sb.setLength(0);
		kalium = Integer.parseInt(txtKalium.getText());
		sb.append(kalium).append(" %");
		kaliumString = sb.toString();
		sb.setLength(0);
		magnesium = Integer.parseInt(txtMagnesium.getText());
		sb.append(magnesium).append(" %");
		magnesiumString = sb.toString();
		sb.setLength(0);
		
		if(isEingabeLeer()){
			
			throw new InputException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
		
		}else{
			
			return true;

		}
	}

	private boolean isEingabeLeer() {
		//Ein Dünger kann auch mal keinen Stickstoff enthalten oder Phosphat usw.
		if(marke.length() == 0 || stickstoff <= -1 || phosphat <= -1 || kalium <= -1 || magnesium <= -1){
		
			return true;
		
		}else{
		
			return false;
		}
	}
	
	private boolean duengerNichtVorhanden() {
		
		boolean isVorhanden = false;
		
		try {
			isVorhanden = ueberpruefeDuenger();
			
		} catch (InputException e) {
			System.out.println("Duenger schon vorhanden Exception!");
		}

		return isVorhanden;
	}

	private boolean ueberpruefeDuenger() throws InputException {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT p FROM Duenger p WHERE  p.duengerMarke = :name");
   	 			  q.setParameter("name", marke);
   	 			  
   	 	if(q.getResultList().size() == 0){
   	   	 	em.close();   
   	   	    System.out.println("Duenger noch nicht vorhanden.");
   	   	    return true;

   	 		   
   	 	 }else{
   	   	    em.close();
   	   	    throw new InputException("Duenger schon vorhanden.");
   	 	   
   	 	 }
	}
}
